package controllers

import (
	"LoveU/models"
	"LoveU/utils"

	"strconv"

	"github.com/astaxie/beego"
)

type FriendController struct {
	beego.Controller
}

// 添加好友
// 需要的参数：
// friendid
func (this *FriendController) AddFriend() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginFriend(this)
		return
	}
	userid := mySession.Get("userid")

	friendid := this.Input().Get("friendid")
	friendid_int, err := strconv.ParseInt(friendid, 10, 64)
	var codejson interface{}
	if err != nil {
		codejson = utils.Message{utils.ARGUMENT_DENIED, "参数格式错误", nil, ""}
		this.Data["json"] = codejson
		this.ServeJSON()
		return
	}

	attach := this.Input().Get("attach")
	status := models.AddFriend(userid.(int64), friendid_int, attach)
	switch status {
	case utils.USER_NOT_FOUND:
		codejson = utils.Message{utils.USER_NOT_FOUND, "用户不存在", nil, ""}
	case utils.DATABASE_ERROR:
		codejson = utils.Message{utils.UNKNOWN_ERROR, "数据库错误", nil, ""}
	case utils.IS_A_FRIEND:
		codejson = utils.Message{status, "已互为好友", nil, ""}
	case utils.FRIENDS_REQUEST_OK:
		codejson = utils.Message{utils.FRIENDS_REQUEST_OK, "success", nil, ""}
	case utils.FRIENDS_REQUEST_WAITING:
		codejson = utils.Message{utils.FRIENDS_REQUEST_WAITING, "申请已发，等待回复", nil, ""}
	default:
		codejson = utils.Message{utils.UNKNOWN_ERROR, "系统错误", nil, ""}
	}
	this.Data["json"] = codejson
	this.ServeJSON()
	return

}

func (this *FriendController) AddFriendByName() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginFriend(this)
		return
	}
	userid := mySession.Get("userid")

	username := this.Input().Get("name")
	attach := this.Input().Get("attach")
	status := models.AddFriendStr(userid.(int64), username, attach)
	var codejson interface{}
	switch status {
	case utils.USER_NOT_FOUND:
		codejson = utils.Message{utils.USER_NOT_FOUND, "用户不存在", nil, ""}
	case utils.DATABASE_ERROR:
		codejson = utils.Message{utils.UNKNOWN_ERROR, "数据库错误", nil, ""}
	case utils.IS_A_FRIEND:
		codejson = utils.Message{status, "已互为好友", nil, ""}
	case utils.FRIENDS_REQUEST_OK:
		codejson = utils.Message{utils.FRIENDS_REQUEST_OK, "success", nil, ""}
	case utils.FRIENDS_REQUEST_WAITING:
		codejson = utils.Message{utils.FRIENDS_REQUEST_WAITING, "申请已发，等待回复", nil, ""}
	default:
		codejson = utils.Message{utils.UNKNOWN_ERROR, "系统错误", nil, ""}
	}
	this.Data["json"] = codejson
	this.ServeJSON()
	return
}

// 删除好友
// 需要的参数：
// friendid
//-----------------------------------------------
// 返回的数据：
// utils.LOGGED_IN：
// utils.ARGUMENT_DENIED：
// utils.LOGIN_USRWRONG：
func (this *FriendController) RemoveFriend() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginFriend(this)
		return
	}
	userid := mySession.Get("userid")
	friendid := this.Input().Get("friendid")
	if friendid == "" {
		getJSONFriend(this, utils.ARGUMENT_DENIED, "参数错误", "", nil)
	}
	friendid_int, err0 := strconv.ParseInt(friendid, 10, 64)
	if err0 != nil {
		getJSONFriend(this, utils.ARGUMENT_DENIED, "参数错误", "", nil)
	}
	status := models.DeleteFriend(userid.(int64), friendid_int)
	switch status {
	case utils.LOGIN_USRWRONG:
		getJSONFriend(this, utils.LOGIN_USRWRONG, "用户不存在", "", nil)
		return
	case utils.NOT_A_FRIEND:
		getJSONFriend(this, utils.NOT_A_FRIEND, "对方不是你的好友", "", nil)
		return
	case utils.UNKNOWN_ERROR:
		getJSONFriend(this, utils.UNKNOWN_ERROR, "系统错误", "", nil)
		return
	case utils.FRIENDS_REMOVE_OK:
		getJSONFriend(this, utils.FRIENDS_REMOVE_OK, "success", "", nil)
		return
	default:
		getJSONFriend(this, utils.UNKNOWN_ERROR, "系统错误", "", nil)
		return
	}

}

//-----------------------------------------------
// --------------------------功能未实现
//-----------------------------------------------
// 查询好友
func (this *FriendController) SearchFriend() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginFriend(this)
		return
	}
	// userid := mySession.Get("userid")
}

//-----------------------------------------------
// --------------------------功能未实现
//-----------------------------------------------
// 根据需求推荐好友
func (this *FriendController) RefereeFriend() {
	sid := this.Input().Get("sessionid")
	code := checkSession(this.Ctx, sid)
	if code != utils.LOGGED_IN {
		notLoginFriend(this)
	}
	userid := this.GetSession("userid")
	if userid == nil {
		notLoginFriend(this)
	}

}

// 获取好友列表
func (this *FriendController) GetFriends() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginFriend(this)
		return
	}
	userid := mySession.Get("userid")
	users, status := models.GetFriends(userid.(int64))
	switch status {
	case utils.FRIENDS_LIST_OK:
		getJSONFriend(this, utils.FRIENDS_LIST_OK, "success", "", users)
	case utils.UNKNOWN_ERROR:
		getJSONFriend(this, utils.UNKNOWN_ERROR, "系统错误143", "", nil)
	default:
		beego.Error(status)
		getJSONFriend(this, utils.UNKNOWN_ERROR, "系统错误146", "", nil)
	}
}

//获取用户的好友的申请
func (this *FriendController) GetFriendsRequest() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginFriend(this)
		return
	}
	userid := mySession.Get("userid")

	page_str := this.Input().Get("page")
	if page_str == "" {
		getJSONFriend(this, utils.ARGUMENT_DENIED, "参数错误41", "", nil)
		return
	}
	page, err0 := strconv.ParseInt(page_str, 10, 64)
	pageSize_str := this.Input().Get("pagesize")
	if pageSize_str == "" {
		getJSONFriend(this, utils.ARGUMENT_DENIED, "参数错误47", "", nil)
		return
	}
	pageSize, err1 := strconv.ParseInt(pageSize_str, 10, 64)

	if err0 != nil || err1 != nil {
		getJSONFriend(this, utils.ARGUMENT_DENIED, "参数错误63", "", nil)
		return
	}

	frequests, status := models.GetRequest(userid.(int64), page, pageSize)
	switch status {
	case utils.FRIENDS_REPLY_OK:
		getJSONFriend(this, utils.FRIENDS_REPLY_OK, "success", "", frequests)
		return
	case utils.UNKNOWN_ERROR:
		getJSONFriend(this, utils.UNKNOWN_ERROR, "系统错误", "", nil)
		return
	default:
		getJSONFriend(this, utils.UNKNOWN_ERROR, "系统错误", "", nil)
		return
	}
}

//获取我的好友的申请
func (this *FriendController) GetMyFriendsRequest() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginFriend(this)
		return
	}
	userid := mySession.Get("userid")

	frequests, status := models.GetMyRequest(userid.(int64))
	switch status {
	case utils.FRIENDS_REPLY_OK:
		getJSONFriend(this, utils.FRIENDS_REPLY_OK, "success", "", frequests)
		return
	case utils.UNKNOWN_ERROR:
		getJSONFriend(this, utils.UNKNOWN_ERROR, "系统错误", "", nil)
		return
	default:
		getJSONFriend(this, utils.UNKNOWN_ERROR, "系统错误", "", nil)
		return
	}
}

//同意好友申请
func (this *FriendController) AgreeRequest() {
	sid := this.Input().Get("sessionid")
	mySession := SessionStore[sid]
	if mySession == nil {
		notLoginFriend(this)
		return
	}
	userid := mySession.Get("userid")

	friendid := this.Input().Get("friendid")
	//beego.Error(friendid)
	if friendid == "" {
		getJSONFriend(this, utils.ARGUMENT_DENIED, "参数错误214", "", nil)
		return
	}
	friendidInt, err0 := strconv.ParseInt(friendid, 10, 64)
	//beego.Error(friendidInt)
	if err0 != nil {
		getJSONFriend(this, utils.ARGUMENT_DENIED, "参数错误218", "", nil)
		return
	}
	agree := this.Input().Get("agree")
	//beego.Error(agree)
	if agree == "" {
		getJSONFriend(this, utils.ARGUMENT_DENIED, "参数错误222", "", nil)
		return
	}
	agreeInt, err1 := strconv.ParseInt(agree, 10, 64)
	//beego.Error(agreeInt)
	if err1 != nil {
		getJSONFriend(this, utils.ARGUMENT_DENIED, "参数错误226", "", nil)
		return
	}
	status := models.ConfirmFriend(userid.(int64), friendidInt, agreeInt)
	// status := utils.LOGIN_USRWRONG

	switch status {
	case utils.USER_NOT_FOUND:
		getJSONFriend(this, utils.USER_NOT_FOUND, "用户不存在", "", nil)
		return
	case utils.NOT_A_FRIEND: //未使用
		getJSONFriend(this, utils.NOT_A_FRIEND, "对方不是你的好友", "", nil)
		return
	case utils.FRIENDS_REQUEST_NOT_EXIST:
		getJSONFriend(this, utils.FRIENDS_REQUEST_NOT_EXIST, "双方之间没有好友申请", "", nil)
		return
	case utils.ARGUMENT_DENIED:
		getJSONFriend(this, utils.ARGUMENT_DENIED, "确认加好友参数错误", "", nil)
		return
	case utils.FRIENDS_REPLY_OK:
		getJSONFriend(this, utils.FRIENDS_REPLY_OK, "success", "", nil)
		return
	case utils.FRIENDS_REPLY_DENY:
		getJSONFriend(this, utils.FRIENDS_REPLY_DENY, "success", "", nil)
		return
	default:
		getJSONFriend(this, utils.UNKNOWN_ERROR, "系统错误", "", nil)
		return
	}

}
